#ifndef __W_ONLINE_H_
#define __W_ONLINE_H_
#include <mutex>
#include <unordered_map>

#include "util.hpp"

class online_manager
{
public:

    // 该用户ID 在websocket连接建立时 才会加入 游戏大厅的在线用户管理
    void enter_game_hall(uint64_t uid, wsserver_t::connection_ptr& conn)
    {
        unique_lock<mutex> lock(_mutex);
        _hall_user.insert(make_pair(uid,conn));
    }
    // 该用户ID 在websocket连接建立时 才会加入 游戏房间的在线用户管理
    void enter_game_room(uint64_t uid, wsserver_t::connection_ptr& conn)
    {
        unique_lock<mutex> lock(_mutex);
        _room_user.insert(make_pair(uid,conn));
    }
    // 该用户ID 在websocket连接断开时 才会移除 游戏大厅的在线用户管理
    void exit_game_hall(uint64_t uid)
    {
        unique_lock<mutex> lock(_mutex);
        _hall_user.erase(uid);
    }
    // 该用户ID 在websocket连接断开时 才会移除 游戏房间的在线用户管理
    void exit_game_room(uint64_t uid)
    {
        unique_lock<mutex> lock(_mutex);
        _room_user.erase(uid);
    }
    // 判断指定用户是否在游戏大厅
    bool is_in_game_hall(uint64_t uid)
    {   
        unique_lock<mutex> lock(_mutex);
        auto it = _hall_user.find(uid);
        if(it == _hall_user.end())
            return false;
        
        return true;
    }
    // 判断指定用户是否在游戏房间
    bool is_in_game_room(uint64_t uid)
    {
        unique_lock<mutex> lock(_mutex);
        auto it = _room_user.find(uid);
        if(it == _room_user.end())
            return false;
        
        return true;
    }
    // 通过用户ID在游戏大厅用户管理中获取对应的通信连接
    wsserver_t::connection_ptr get_conn_from_hall(uint64_t uid)
    {
        unique_lock<mutex> lock(_mutex);
        auto it = _hall_user.find(uid);
        if(it == _hall_user.end())
        {
            return  NULL;
        }

        return it->second;
    }
    // 通过用户ID在游戏房间用户管理中获取对应的通信连接
    wsserver_t::connection_ptr get_conn_from_room(uint64_t uid)
    {
        unique_lock<mutex> lock(_mutex);
        auto it = _room_user.find(uid);
        if(it == _room_user.end())
        {
            return  NULL;
        }

        return it->second;
    }

private:
    // 用于建立游戏大厅中用户的id与通信连接的关系
    unordered_map<uint64_t, wsserver_t::connection_ptr> _hall_user;
    // 用于建立游戏房间中用户的id与通信连接的关系
    unordered_map<uint64_t, wsserver_t::connection_ptr> _room_user;
    mutex _mutex;
};
#endif